package com.example.live.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.example.live.pojo.entity.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class VerifyToken {

    @Value("${token.key}")
    private String KEY;

    public User verify(String token) {
        User user = new User();
        /*判断token是否存在，若不存在，验证失败，
            并进行验证失败的逻辑操作（例如跳转到登录界面，
            或拒绝访问等等）*/
        if (token == null) return user;

        /*获取jwt的验证器对象，传入的算法参数以及密钥字符串（KEY）必须
        和加密时的相同*/
        JWTVerifier require = JWT.require(Algorithm.HMAC256(KEY)).build();

        DecodedJWT decode;
        try {

            /*开始进行验证，该函数会验证此token是否遭到修改，
                以及是否过期，验证成功会生成一个解码对象
                ，如果token遭到修改或已过期就会
                抛出异常，我们用try-catch抓一下*/
            decode = require.verify(token);

        } catch (Exception e) {

            //抛出异常，验证失败
            return user;
        }

        //若验证成功，就可获取其携带的信息进行其他操作

        //可以一次性获取所有的自定义参数，返回Map集合
        Map<String, Claim> claims = decode.getClaims();
        if (claims == null) return user;
        //claims.forEach((k, v) -> System.out.println(k + " " + v.asString()));

        //也可以根据自定义参数的键值来获取
        if (!decode.getClaim("isVIP").asBoolean()) return user;
        user.setId(decode.getClaim("id").asString());

        //获取发送者，没有设置则为空
        //System.out.println(decode.getIssuer());

        //获取过期时间
        //System.out.println(decode.getExpiresAt());

        //获取主题，没有设置则为空
        //System.out.println(decode.getSubject());
        //返回openid
        return user;

    }
}
